// packageB/pages/classCategoryList/classCategoryList.js
import { useGetQuestion } from '../../../utils/useGetQuestion';
import { useDelOneQuestion, useDELAllQuestion } from '../../../utils/useDelQuestion';
import Toast from '../../../miniprogram_npm/@vant/weapp/toast/toast';
import Dialog from '../../../miniprogram_npm/@vant/weapp/dialog/dialog';
Page({

    /**
     * 页面的初始数据
     */
    data: {
        resArr: Array, // 获取到的数据
        options: Object, // 上个页面传递的参数
        skipNum: 0, // 从第几个数据开始获取
        currentPage: 0, // 当前是第几页
        limitNum: 11, // 要获取几条数据
        isShowOnReachTips: false, // 上拉加载的提示，是否显示
        isMoreDataTips: false, // 是否以及获取了所有的数据了
        startOnReachBottom: false, // 目前是否时上拉操作
        searchVal: '', // 搜索框的值
        empty: false, // 空页面
    },

    /** 
     * 空页面时，点击底部按钮去录入错题
    */
    toTextEntry() {
        wx.switchTab({
            url: '../../../pages/index/index',
        })
    },

    /**
     * 搜索框的值发生改变时触发
     */
    onChangeVal(e) {
        this.setData({
            searchVal: e.detail,
        });
        // 输入框没有值的时候，发生改变，列表还原
        if (e.detail === '') {
            this.onReady();
        };
    },

    /*
     * 清空输入框值时触发，重新渲染列表 
     */
    onClearVal() {
        this.onReady();
    },

    /**
     *  关键词搜索
     */
    onSearchVal() {
        const that = this;
        const { searchVal, resArr } = that.data;
        if (searchVal) {
            // 从 resArr.title 里进行搜索
            const newResArr = resArr.filter(item => {
                return item.title.indexOf(searchVal) !== -1;
            })
            // 如果没有搜到结果，做一个提示
            if (newResArr.length === 0 || !newResArr) {
                Toast('没有搜索到该题目');
            } else {
                that.setData({
                    resArr: [...newResArr],
                })
            }
        } else {
            Toast('搜索内容不能为空');
        };
    },

    /* 
     * 根据 skipNum、limitNum 获取数据
     */
    getData: async function (skipNum, limitNum) {
        const that = this;
        const { className, gradeDesc } = that.data.options;
        // 当前是否进行了上拉加载更多的操作
        const { startOnReachBottom, resArr, currentPage } = that.data;
        if (startOnReachBottom) {
            skipNum = currentPage * limitNum; // 重新获取数据的位置
            const newResArr = await useGetQuestion({ className, gradeDesc: JSON.parse(gradeDesc), skipNum, limitNum }, 'class');
            // 判断这一次加载出来的数据，满不满足11条，不满足的话，说明以及没有更多了
            that.setData({
                resArr: [...resArr, ...newResArr],
                currentPage: currentPage + 1,
            });
            if (newResArr.length < 11) {
                that.setData({
                    isShowOnReachTips: false,
                    isMoreDataTips: true,
                })
            }
        } else {
            // 初始获取错题列表
            // wx.showLoading({
            //     title: '错题获取中...',
            // })
            if (currentPage === 0) {
                const newResArr = await useGetQuestion({ className, gradeDesc: JSON.parse(gradeDesc), skipNum, limitNum }, 'class');
                // wx.hideLoading();
                that.setData({
                    resArr: [...newResArr],
                    currentPage: currentPage + 1,
                }, () => {
                    if (newResArr.length === 0) {
                        // 说明页面是空的，没有数据
                        that.setData({
                            empty: true,
                        })
                    }
                });
            }
        };

        // 如果获取到的条数，不超过11条，上拉加载的提示不能显示出来
        if (resArr.length <= 11) {
            that.setData({
                isShowOnReachTips: false,
            })
        };

        console.log(that.data.resArr);
    },

    /** 
     * 删除一条数据
     */
    onClose(e) {
        const that = this;
        const { position, instance } = e.detail;
        switch (position) {
            case 'cell':
                instance.close();
                break;
            case 'outside':
                instance.close();
                break;
            case 'right':
                Dialog.confirm({
                    message: '确定删除吗？',
                }).then(async () => {
                    instance.close();
                    const { qid } = e.currentTarget.dataset; // qid
                    const { className, gradeDesc } = that.options;
                    // 删除一条数据
                    const res = await useDelOneQuestion(qid, className, JSON.parse(gradeDesc));
                    console.log(res);
                    // 删除成功
                    if (res.result.stats.removed === 1) {
                        console.log(111);
                        // 列表中也需要更新一下
                        const { resArr, skipNum, limitNum } = that.data;
                        const newResArr = resArr.filter(item => {
                            return item._id !== qid;
                        })
                        that.setData({
                            resArr: [...newResArr],
                        }, () => {
                            that.getData(skipNum, limitNum);
                            Toast.success('删除成功');
                        });
                    } else {
                        Toast.success('删除失败');
                    }
                }).catch(() => {
                    instance.close();
                });
                break;
        }
    },

    /** 
     * 清空此课程下所有数据
     */
    onEmptyAll(e) {
        const that = this;
        const { position, instance } = e.detail;
        switch (position) {
            case 'cell':
                instance.close();
                break;
            case 'outside':
                instance.close();
                break;
            case 'right':
                Dialog.confirm({
                    message: '请慎重！确定清空所有题目吗？',
                }).then(async () => {
                    instance.close();
                    const { className, gradeDesc } = that.options;
                    // 清空
                    const res = await useDELAllQuestion(className, JSON.parse(gradeDesc));
                    console.log(res);
                    // 清空成功
                    if (res.result.stats.removed === 1) {
                        console.log(111);
                        // 列表中也需要更新一下
                        that.setData({
                            resArr: [],
                            empty: true,
                        }, () => {
                            that.onReady(); // 刷新一下页面
                            Toast.success('清空列表成功');
                        });
                    } else {
                        Toast.success('清空列表失败');
                    }
                }).catch(() => {
                    instance.close();
                });
                break;
        }
    },

    /** 
     * 进入题目详情页
     */
    toDetail(e) {
        // 只点击内容时触发，防止其他部分点击误触
        if (e.detail === 'cell') {
            console.log(e.currentTarget.dataset);
            const { qid } = e.currentTarget.dataset;
            wx.navigateTo({
                url: `../../../pages/questionDetail/questionDetail?qid=${qid}`,
            })
        }
    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad: function (options) {
        this.setData({
            options
        })
        console.log(options);
    },

    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady: function () {
        // 第一次获取的数据
        const { skipNum, limitNum } = this.data;
        this.getData(skipNum, limitNum);
    },

    /**
     * 生命周期函数--监听页面显示
     */
    onShow: function () {

    },

    /**
     * 生命周期函数--监听页面隐藏
     */
    onHide: function () {

    },

    /**
     * 生命周期函数--监听页面卸载
     */
    onUnload: function () {

    },

    /**
     * 页面相关事件处理函数--监听用户下拉动作
     */
    onPullDownRefresh: function () {
        const that = this;
        that.setData({
            currentPage: 0,
            startOnReachBottom: false,
        }, () => {
            setTimeout(() => {
                wx.stopPullDownRefresh() //停止下拉刷新
                this.getData(0, 11);
                Toast('刷新成功');
            }, 2000)
        })
    },

    /**
     * 页面上拉触底事件的处理函数
     */
    onReachBottom: function () {
        const that = this;
        that.setData({
            isShowOnReachTips: true,
            startOnReachBottom: true,
            isMoreDataTips: false,
        }, () => {
            // 第一次获取的数据
            const { skipNum, limitNum } = that.data;
            that.getData(skipNum, limitNum);
        })
    },

    /**
     * 用户点击右上角分享
     */
    onShareAppMessage: function () {

    }
})